"""
获取部门的数据
如果缓存命中，直接从缓存中读取部门信息
如果没有命中，查询数据库并将查询结果放入缓存
"""
import json
import time

import pymysql
import redis

import common


# 装饰器（decorator）：用一个函数去装饰另外一个函数或类，给他们增加额外的功能
# 装饰器函数的参数是被装饰的函数，返回带装饰功能的函数
# 装饰器的本质是GoF设计模式中的代理模式（proxy），只不过被误命名为装饰器
def record_time(func):

    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__}执行时间: {end - start}秒')
        return result

    return wrapper


# get_depts_info = record_time(get_depts_info)
@record_time
def get_depts_info():
    """获取部门数据"""
    cli = redis.Redis(host='120.77.222.217', password='1qaz2wsx')
    cached_data = cli.get('depts')
    depts = json.loads(cached_data) if cached_data else None
    if not depts:
        conn = common.get_conn(database='hrs')
        try:
            with conn.cursor(pymysql.cursors.DictCursor) as cursor:
                cursor.execute('select * from tb_dept')
                depts = cursor.fetchall()
            cli.set('depts', json.dumps(depts), ex=3600)
        finally:
            conn.close()
    return depts


for dept in get_depts_info():
    print(dept)
